package com.uc3m.dsic.gestorZoo;

import java.sql.*;
import java.util.*;

/**
 * En esta clase se encuentran todos las operaciones que tratan principalmente
 * con animales
 * 
 * @author Rafael Galvez Sanchez
 * @version 1.0
 */
public class GestorAnimal {

    Sala database;
    Connection con;
    Statement sentencia;

    /**
     * Dado un identificador de un zoo, devuelve los animales de ese zoo y
     * en que sala se encuentran.
     *
     * @param id_zoo
     *          identificador del zoo que queremos extraer la informacion
     * @return Un Arraylist con los animales que cumplen la restriccion
     * de la consulta.
     *
     * @throws Exception si se produce cualquier tipo de error.
     */
    public ArrayList<Animal> getAnimalesByZoo(String id_zoo) throws Exception {

        ArrayList<Animal> resultado;
        Animal animal;
        String nombre;
        String especie;
        int edad;
        String descripcion;
        String sala;
        String pais;
        String extincion;
        String enfermedad;
        ResultSet rs, rs2, rs3;
        String auxiliar;
        String auxiliar2;
        ArrayList<String> aux, aux2;
        Iterator it;
        GestorZooInterface izoo = new GestorZooAplicacion();

        resultado = new ArrayList<Animal>();
        aux = new ArrayList<String>();
        aux2 = new ArrayList<String>();
        rs = izoo.getTabla(GestorZooAplicacion.Tablas.ANIMAL);
        rs2 = izoo.getTabla(GestorZooAplicacion.Tablas.ZOO);
        rs3 = izoo.getTabla(GestorZooAplicacion.Tablas.SALA);

        while (rs2.next()) {
            //se obtiene el id del zoo
            auxiliar = rs2.getString(1).toUpperCase();
            //si coincide con el pasado por parametro...
            if (auxiliar.compareTo(id_zoo.toUpperCase()) == 0) {
                //lo guardamos en un array
                aux.add(auxiliar);
            }
        }

        //iterador sobre claves de Zoo
        it = aux.iterator();

        while (it.hasNext()) {
            //se obtiene a partir del iterador las claves de Zoo
            auxiliar = (String) it.next();
            while (rs3.next()) {
                //se obtiene la clave de Zoo en Sala
                auxiliar2 = rs3.getString(4).toUpperCase();
                //si coincide con la clave actual de iterador...
                if (auxiliar.compareTo(auxiliar2) == 0) {
                    //lo guardamos en un array
                    aux2.add(rs3.getString(1).toUpperCase());
                }
            }
        }

        //creamos iterador sobre claves de Sala
        it = aux2.iterator();

        while (it.hasNext()) {
            //se obtiene a partir del iterador las claves de Sala
            auxiliar = (String) it.next();
            while (rs.next()) {
                //se obtiene la clave de la Sala en Animal
                sala = rs.getString(8);
                //si coincide con la clave actual del iterador...
                if (sala.compareTo(auxiliar) == 0) {
                    nombre = rs.getString(1).toUpperCase();
                    especie = rs.getString(2).toUpperCase();
                    edad = rs.getInt(3);
                    descripcion = rs.getString(4).toUpperCase();
                    pais = rs.getString(5).toUpperCase();
                    extincion = rs.getString(6).toUpperCase();
                    enfermedad = rs.getString(7).toUpperCase();
                    animal = new Animal(nombre, especie, edad, descripcion,
                            sala, pais, extincion, enfermedad);
                    resultado.add(animal);
                }
            }
            rs = izoo.getTabla(GestorZooAplicacion.Tablas.ANIMAL);
        }
        return resultado;
    }

    /**
     * Dado un pais, devuelve todos los animales de ese pais
     *
     * @param pais
     *          pais de los animales
     *
     * @return Un Arraylist con los animales de ese pais
     *
     * @throws Exception si se produce cualquier tipo de error.
     */
    public ArrayList<Animal> getAnimalByPais(String pais) throws Exception {
        GestorZooInterface izoo = new GestorZooAplicacion();
        ArrayList<Animal> resultado = new ArrayList<Animal>();
        Animal animal;
        String nombreAnimal, especieAnimal, descripcionAnimal, salaAnimal, 
                paisAnimal, extincionAnimal, enfermedadAnimal;
        int edadAnimal;
        int aux = 0;

        ResultSet rsAnimal = izoo.getTabla(GestorZooAplicacion.Tablas.ANIMAL);

        while (rsAnimal.next()) {
            //obtenemos pais de la tupla actual del animal
            paisAnimal = rsAnimal.getString(5).toUpperCase();
            //si es igual a la pasada por parametro...
            if (paisAnimal.compareTo(pais.trim().toUpperCase()) == 0) {
                //obtengo claves de animal
                nombreAnimal = rsAnimal.getString(1).toUpperCase();
                especieAnimal = rsAnimal.getString(2).toUpperCase();
                edadAnimal = rsAnimal.getInt(3);
                descripcionAnimal = rsAnimal.getString(4).toUpperCase();
                salaAnimal = rsAnimal.getString(8).toUpperCase();
                extincionAnimal = rsAnimal.getString(6).toUpperCase();
                enfermedadAnimal = rsAnimal.getString(7).toUpperCase();
                animal = new Animal(nombreAnimal, especieAnimal, edadAnimal,
                        descripcionAnimal, salaAnimal, paisAnimal,
                        extincionAnimal, enfermedadAnimal);
                aux = 1;
                resultado.add(animal);
            }
        }

        if(aux == 0){
            throw new ZooException("No existe ninguna ocurrencia en la " +
                    "base de datos con la cadena proporcionada");
        }

        return resultado;
    }

    /**
     * Obtiene el resultado concreto de la base de datos proporcionado por un
     * identificador de animal
     *
     * @param nombre
     *          Nombre del animal
     * @param especie
     *          Especie del animal
     * @return Fila con todos los campos que coinciden con la clave proporcionada
     * @throws ZooException
     * @throws Exception
     */
    public Animal getAnimalbyId(String nombre, String especie)
            throws ZooException, Exception {

        ResultSet rstemp;
        Animal nuevo_animal = null;

        String nombreAnimal, especieAnimal, descripcionAnimal, salaAnimal,
                paisAnimal, extincionAnimal, enfermedadAnimal;
        int edadAnimal;

        
            GestorZooInterface gtemp = new GestorZooAplicacion();
            rstemp = gtemp.getTabla(GestorZooAplicacion.Tablas.ANIMAL);

            while (rstemp.next()) {
                nombreAnimal = rstemp.getString(1).toUpperCase();
                especieAnimal = rstemp.getString(2).toUpperCase();
                if (nombre.trim().toUpperCase().compareTo(nombreAnimal) == 0 &&
                    especie.trim().toUpperCase().compareTo(especieAnimal) == 0) {
                        edadAnimal = rstemp.getInt(3);
                        descripcionAnimal = rstemp.getString(4).toUpperCase();
                        salaAnimal = rstemp.getString(8).toUpperCase();
                        paisAnimal = rstemp.getString(5).toUpperCase();
                        extincionAnimal = rstemp.getString(6).toUpperCase();
                        enfermedadAnimal = rstemp.getString(7).toUpperCase();
                        nuevo_animal = new Animal(nombreAnimal, especieAnimal,
                                edadAnimal, descripcionAnimal, salaAnimal,
                                paisAnimal, extincionAnimal, enfermedadAnimal);
                        break;
                }
            }
            return nuevo_animal;
    }
}




